package com.lds.offer.demo;

/**
 * @description: Offer 65. 不用加减乘除做加法
 * @author: lds
 * @create: 2022-10-07 10:12
 **/
public class Offer_65_不用加减乘除做加法 {

    //https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/

    /**
     *
     *  十进制加法：5 + 7 = 12 其中运算为：未进位数+进位数 -> 2 + 10 -> 直到进位数位0时位最终结果
     *  5的二进制： 0  0  0  0  0  1  0  1
     *  7的二进制： 0  0  0  0  0  1  1  1
     *  未进位数：  0  0  0  0  0  0  1  0    -> 未进位数： 相当于异或运算           -> 5 ^ 7
     *  其进位数：  0  0  0  0  1  0  1  0    -> 其进位数： 相当于与运算左移一位      -> （5 & 7）<< 1
     *
     *  其进位数不为零，继续运算后
     *
     *  未进位数：  0  0  0  0  1  0  0  0
     *  其进位数：  0  0  0  0  0  1  0  0
     *
     *  其进位数不为零，继续运算后
     *
     *  未进位数：  0  0  0  0  1  1  0  0
     *  其进位数：  0  0  0  0  0  0  0  0
     *
     *  进位数为零，运算结束： 1100 为最终结果,转换十进制  -> 12
     *
     *  PS: 减法类似，减去一个数等于加上这个数的相反数
     */

    public static int add(int a, int b) {
        while(b != 0) {
            int c = (a & b) << 1;
            a ^= b;
            b = c;
        }
        return a;
    }

    public static void main(String[] args) {
        int add = add(1, 5);
        System.out.println(add);
    }
}
